use trpl::{Either, Html};
use std::thread;

fn main() {
    let args: Vec<String> = std::env::args().collect();
    println!("{:?}", args);
    let name:String = "hello".to_string();

    //注意async关键字，并不会导致开启一个新的线程，仅仅意味着可以在内部使用await关键字等待异步操作完成。
    trpl::run(async {
        //lazy future 这里不会执行
        let title_fut_1 = page_title(&args[1]);
        //lazy future 这里不会执行
        let title_fut_2 = page_title(&args[2]);

        //race中的代码使用future::select执行并发，并返回最先完成的future。
        //因为这里真正开始执行，所以才会在多次运行的时候，返回可能不同的结果
        let (url, maybe_title) = match trpl::race(title_fut_1, title_fut_2).await {
            Either::Left(left) => left,
            Either::Right(right) => right,
        };

        println!("{url} returned first");
        match maybe_title {
            Some(title) => println!("Its page title is: '{title}'"),
            None => println!("Its title could not be parsed."),
        }
    })
}

async fn page_title(url: &str) -> (&str, Option<String>) {
    //这个语句会证实函数page_title是运行在主线程中...,并不是多线程的.
    println!("线程{:?}正在执行", thread::current().id());
    let text = trpl::get(url).await.text().await;
    let title = Html::parse(&text)
        .select_first("title")
        .map(|title| title.inner_html());
    (url, title)
}